package com.mky.myrule;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;

import java.util.List;

public class RandomRule_MKY extends AbstractLoadBalancerRule{

    //total = 0 //当前total==5以后，我们指针才能往下走
    //index = 0 //当前对外提供服务的服务器地址，
    //total需要重新置为零，但是已经达到过一次5，index=  1
    //分析：我们定义5次，但是微服务只有8001,8002,8003三台
    //index<=3

    private int total = 0;  //总共被调用的次数，目前要求每台被调用5次
    private int currentIndex = 0;  //当前提供服务的机器号

    public Server choose(ILoadBalancer lb , Object key) {
        if(lb == null){
            return null;
        }
        Server server = null;

        while (server == null){
            if(Thread.interrupted()){
                return null;
            }
            List<Server> uplist = lb.getReachableServers();
            List<Server> allList = lb.getAllServers();

            int serverCount = allList.size();
            if(serverCount == 0){
                return null;
            }

//            private int total = 0;  //总共被调用的次数，目前要求每台被调用5次
//            private int currentIndex = 0;  //当前提供服务的机器号
           //自定义算法
            if(total < 5){
                //第一次 total < 5 0号机被调用
                server = uplist.get(currentIndex);
                total++;
            }else{
                total = 0;
                currentIndex++;
                //服务器号是否大于机器总数量
                if(currentIndex >= uplist.size()){
                   //当服务器号>服务总台数 重置为0
                    currentIndex = 0;
                }
            }

            if(server == null){
                Thread.yield();
                continue;
            }

            if(server.isAlive()){
                return (server);
            }

            server = null;
            Thread.yield();

        }
        return server;
    }

    @Override
    public Server choose(Object key) {
        return choose(getLoadBalancer(),key);
    }

    @Override
    public void initWithNiwsConfig(IClientConfig iClientConfig) {

    }
}
